#ifndef LEVEL_H
#define LEVEL_H

#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <cstdlib>
#include <ctime>
#include <unistd.h>

#include "Joueur.h"
#include "NonJoueur.h"
#include "Vision.h"


#define MURBAS -3
#define MURHAUT -2
#define MURDROIT -1
#define VIDE 0
#define POINT 1
#define COULOIR 2
#define SPAWN 3
#define FIN 4




using namespace std;
/*!
 * \file Level.h
 * \brief Gestion du level en cours (affichage mise à jour de la position des perso)
 * \author Nicolas JAEGER
 * \version 0.1
 */



class Level
{
    public:

        /*! \brief Constructeur
         * Constructeur de la classe level à utiliser lorsque le joueur à déjà été crée
         * \param j pointeur sur un objet du type joueur
         */
        Level(Joueur* j,TextManager* txtmngr); //Construteur suivant qui renprend le joueur


        virtual ~Level();
        /*! \brief Méthode de Level
         * Dessine le niveau à l'écran
         */
        void draw();
        /*! \brief Méthode de Level
         *  Met à jour la position des différent personnage (joueur ou non)
         */

        void updatePerso();
        /*! \brief Méthode de Level
         *  deplace le joueur en fonction de la dernière commande
         */
        bool movePerso(int lastCommand);
        /*! \brief Méthode de Level
         *  Retourne le pointeur de joueur
         */
        Joueur* getJoueur();
        /*! \brief Méthode de Level
         *  Deplace le joueur sur le SPAWN
         */
        void moveJoueurSpawn();
        /*! \brief Méthode de Level
         *  Deplace le joueur sur la FIN
         */
        void moveJoueurFin();
        /*! \brief Méthode de Level
         *  Methode à appeler quand le joueur revient sur le niveau et le place sur le point de départ approprié
         */
        void changedLevel(Type_Edge b);
        /*! \brief Méthode de Level
         *  Rajoute un personnage non joueur à la position x,y
         *  \param x Position sur l'axe des abscisses
         *          y Position sur l'axe des ordonnées
         */
        void addNonJoueur(int x, int y);
        /*! \brief Méthode de level
         *   Ajoute un personnage non joueur à une position aléatoire
          */
        void addRandomNonJoueur();
        /*! \brief Appelle les ia respectives des personnages présent dans le niveau
         */
        void iaNonJoueur();
        /*! \brief Met à jour la position de joueur dans le tableau perso_niveau_ pour l'affichage
            */
        void updatePosition();
        bool getChangeLevel();
        Type_Edge getTypeChange();
         void moveJoueurPorte(int porte);
         void gestionAttaqueDistJoueur(direction a);
    protected:
    private:
        /*! \brief Méthode de Level
         *  Remet persoNiveau à zéro
         */
        void resetPersoNiveau();
        /*! \brief Gere les attaques du joueur sur les ennemis
         */
        void gererAttaqueSurEnnemis(int id);
        /*! \brief Gere les attaques des ennemis sur le joueur
         */
        void gererAttaqueDeEnnemis(int id);
        /*! \brief Gere les collisions du joueur (à utiliser après les mouvements du joueur)
         */
        void gererCollisionJoueur();
        /*! \brief Gere la mort des ennemis
         */
        void gererMort();
        /*! \brief Gere les collisions des ennemis (à utiliser après les mouvements de l'ia)
         */
        void gererCollisionNonJoueur();
        int persoSurLigne(direction a);
        void convertDir(int &dx,int &dy,direction a);
        void animerProjectile(position a,position b,direction c);
        void resetProjectile();


        Map* m_;        /*< Pointeur vers l'objet map qui gère la carte du monde */
        Vision* v_;    /*<  Pointeur vers l'objet vision qui gère la vision du personnage (et uniquement celle ci pas pour l'ia ) */
        int persoNiveau_[NY][NX];     /*< Tableau (carte du monde) contennant les personnages et le joueur identifier avec leur id */
        Joueur* j_;                  /*< Pointeur sur le joueur */
        map<int,NonJoueur*> p_;     /*< Vector conntennant les ennemis du joueur */
        TextManager* txtmngr_;      /*< Pointeur vers l'objet qui gère l'affichage des messages */

        bool changeLevel_;   /*< Condition pour passer aux niveau inférieur */
        Type_Edge type_change_;
        bool projectile_[NY][NX];

};

#endif // LEVEL_H
